package com.radar.util;

import com.google.common.cache.*;
import com.radar.exception.RadarDecodeError;
import com.radar.io.CinradRadar;
import lombok.extern.slf4j.Slf4j;

import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

@Slf4j
public class RadarMap {

    public static LoadingCache<String, Optional<CinradRadar>> sessionCache;

    static {
        sessionCache = CacheBuilder.newBuilder()
                .maximumSize(1000)   //最大能缓存的容量
                .expireAfterAccess(2, TimeUnit.HOURS)
                .expireAfterWrite(6, TimeUnit.HOURS)
                .recordStats()  //开启统计功能
                .removalListener((RemovalListener<String, Optional<CinradRadar>>) removalNotification -> {
                    Optional<CinradRadar> value = removalNotification.getValue();
                    if (value.isPresent()) {
                        log.info("sessionCache stats: {},Cause : {}, dispose cinradar file:{}", sessionCache.stats(),removalNotification.getCause().toString(), value.get().radar.filePath);
                        if(value.get().radar != null){
                            value.get().dispose();
                        }
                        value.get().bytes = null;
                    }
                })
                .build(new CacheLoader<String, Optional<CinradRadar>>() {
                    @Override
                    public Optional<CinradRadar> load(String key) {
                        return Optional.empty();
                    }
                });
    }

    public static CinradRadar cacheRadar(String sessionId, String file) throws ExecutionException, RadarDecodeError {
        if (sessionId == null) {
            return null;
        }
        CinradRadar radar = getRadar(file);
        return radar;
//        synchronized (sessionCache) {
//            Optional<CinradRadar> cinradRadar = sessionCache.get(sessionId);
//            if (cinradRadar == null || !cinradRadar.isPresent()) {
//                CinradRadar radar = getRadar(file);
//                sessionCache.put(sessionId, Optional.ofNullable(radar));
//                log.info("sessionCache stats: {}, users : {} open cinradar file : {}", sessionCache.stats(), sessionId, file);
//                return radar;
//            } else {
//                String f = cinradRadar.get().radar.filePath;
//                if (file.equals(f)) {
//                    if(cinradRadar.get().radar.netcdf == null){
//                        cinradRadar = Optional.ofNullable(getRadar(file));
//                        sessionCache.put(sessionId, cinradRadar);
//                    }
//                    return cinradRadar.get();
//                } else {
//                    cinradRadar.get().dispose();
//                    cinradRadar = Optional.ofNullable(getRadar(file));
//                    sessionCache.put(sessionId, cinradRadar);
//                    log.info("sessionCache stats: {}, users : {} open new cinradar file : {}", sessionCache.stats(), sessionId, file);
//                }
//            }
//            return cinradRadar.get();
//        }
    }

    private static CinradRadar getRadar(String file) throws RadarDecodeError {
        CinradRadar cinradRadar = new CinradRadar();
        cinradRadar.parse(file);
        return cinradRadar;
    }

    public static void main(String[] args) throws ExecutionException, RadarDecodeError {
        cacheRadar("cccc", "/Users/xx/data/micaps/SINGLERADAR/ARCHIVES/PRE_QC/Z9836/Z_RADR_I_Z9836_20190730022600_O_DOR_CA_CAP.bin.bz2");
    }

}
